#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+55;
namespace Tree{
    const int M=N*80;
    int cnt,rt[N],num[M],lson[M],rson[M];
    void add(int &id,int l,int r,int x)
    {
        num[id=++cnt]=1;
        if(l==r) return;
        int mid=(l+r)>>1;
        x<=mid?add(lson[id],l,mid,x):add(rson[id],mid+1,r,x);
    }
    void merge(int &id,int p,int l,int r,bool k)
    {
        // cerr<<id<<" "<<p<<" "<<num[id]<<" "<<num[p]<<endl;
        if(!id||!p) return !k?(id|=p):id=0,void();
        if(l==r) return !k?(num[id]|=num[p]):(num[id]&=num[p]),void();
        int mid=(l+r)>>1;
        merge(lson[id],lson[p],l,mid,k);
        merge(rson[id],rson[p],mid+1,r,k);
        num[id]=num[lson[id]]+num[rson[id]];
        cerr<<id<<" "<<l<<" "<<r<<" "<<num[id]<<endl;
    }
}
int n,m,k,q,in[N],ans[N],ask[N],col[N],num[N];
int arr[N],fro[N];
bool vis[15][15];
ll f[N];
queue<int>Q;
vector<int>edge[N];
inline void inc(int x,int y) {edge[x].push_back(y);}
// void topu()
// {
//     for(int i=1;i<=n;i++) Tree::add(Tree::rt[i],1,n,i);
//     Tree::merge(Tree::rt[2],Tree::rt[1],1,n);
//     Tree::merge(Tree::rt[2],Tree::rt[3],1,n);
//     return;
//     Q.push(1);
//     while(!Q.empty())
//     {
//         int x=Q.front();
//         Q.pop();
//         ans[x]=Tree::num[Tree::rt[x]];
//         // cerr<<x<<" "<<ans[x]<<endl;
//         for(int v:edge[x])
//         {
//             Tree::merge(Tree::rt[v],Tree::rt[x],1,n,vis[v]);
//             vis[v]=1;
//             if(!--in[v]) Q.push(v);
//         }
//     }
// }
void topu(int S)
{
    for(int i=1;i<=n;i++) f[i]=0,fro[i]|=(1<<(i-1));
    if(S==1) return;
    // for(int i=1;i<=n;i++)
    //     cerr<<in[i]<<" \n"[i==n];
    for(int i=1;i<=n;i++) if(i!=S)
        for(int v:edge[i]) if(v!=S) ++in[v];
    f[1]=1,Q.push(1);
    while(!Q.empty())
    {
        int x=Q.front();
        Q.pop();
        for(int v:edge[x])
        {
            if(v==S) continue;
            f[v]+=f[x];
            fro[v]|=fro[x];
            if(!--in[v]) Q.push(v);
        }
    }
}
void Find()
{
    topu(0);
    for(int i=1;i<=n;i++)
    {
        topu(i);
        for(int j=1;j<=n;j++)
            if(!f[j]) vis[i][j]=1;
    }
}
bool dfs(int x,int To)
{
    bool flag=(x==ask[To]);
    for(int v:edge[x]) flag|=dfs(v,To);
    if(flag&&vis[x][ask[To]]) arr[x]|=(1<<(To-1));
        // if(!col[x]) col[x]=To;
        // else col[x]=-1;
    return flag;
}
int main()
{
    freopen("lodge.in","r",stdin);
    freopen("lodge.out","w",stdout);
    scanf("%d%d%d",&n,&m,&q);
    int u,v;
    while(m--) scanf("%d%d",&u,&v),inc(u,v);
    Find();
    // for(int i=1;i<=n;i++)
    //     cerr<<fro[i]<<" \n"[i==n];
    while(q--)
    {
        scanf("%d%d",&k,&u);
        if(k>u) {while(u--) scanf("%d",&v);puts("0");continue;}
        if(n<=10)
            for(int i=1;i<=n;i++) arr[i]=0;
        for(int i=1;i<=u;i++)
            scanf("%d",ask+i),dfs(1,i);
        // for(int i=1;i<=n;i++)
        //     cerr<<arr[i]<<" \n"[i==n];
            // for(int i=1;i<=n;i++)
            //     cout<<col[i]<<" \n"[i==n];
        int res=0;
        for(int i=0;i<(1<<n);i++)
        {
            if(__builtin_popcount(i)!=k) continue;
            int P=0;
            for(int j=1;j<=u;j++)
                if(__builtin_popcount(i&fro[ask[j]])!=1) goto L;
            // cerr<<"He "<<i<<endl;
            for(int j=0;j<n;j++)
                if(i>>j&1)
                {
                    if(!arr[j+1]) goto L;
                    P|=(arr[j+1]);
                }
            // cerr<<P<<endl;
            if(P==(1<<u)-1) ++res;
            L:;
        }
        printf("%d\n",res);
        // return 0;
    }
    return 0;
}